<?php if (!defined('BASEPATH'))exit('No direct script access allowed');

include_once 'ExceptionDAO.php';
include_once 'util/MapError.php';
include_once 'TOMovimentacao.php';

/**
 * DAO para operações de banco para movimentação
 * 
 * @author Douglas Rafael
 */
class DAOMovimentacao extends CI_Model {


    /**
     * Seleciona a movimentacao do item
     * 
     * @param int $codigo_item Código do item
     * @return array TOEmprestimo
     * @throws ExceptionDAO
     * @throws Exception
     */
    public function get_movimentacao_item($codigo_item) {
        try {
            $this->db->where('codigo', $codigo_item);
            $result = $this->db->get('item_movimentacao');

            //Caso ocorra erro no select
            if (!$result) {
                throw new Exception('Ocorreu um erro de banco de dados ao tentar selecionar movimentação do item.');
            } else {
                foreach ($result->result() as $value) {
                    $movimentacao = new TOMovimentacao();
                    $movimentacao->codigo = $value->codigo;
                    $movimentacao->total_estoque = $value->total_estoque;
                    $movimentacao->total_manipulacao = $value->total_manipulacao;
                    $movimentacao->total_disponivel = $value->total_disponivel;
                    $movimentacao->total_visualizado = $value->total_visualizado;
                    $movimentacao->status = $value->status;
                    $movimentacao->motivo_inatividade = $value->motivo_inatividade;
                }
                return $movimentacao;
            }
        } catch (Exception $e) {
             throw new ExceptionDAO($e->getMessage());
        }
    }

    
    /**
     * Insere movimentacao do item
     * 
     * @param  TOItem $item
     * @throws ExceptionDAO
     * @throws Exception
     */
    public function insert_movimentacao(TOItem $item) {
        try {
            $this->db->set('codigo', $item->codigo);
            $this->db->set('total_estoque', $item->movimentacao->total_estoque);
            $this->db->set('total_manipulacao', $item->movimentacao->total_manipulacao);
            $this->db->set('total_disponivel', $item->movimentacao->total_disponivel);
            $this->db->set('status', $item->movimentacao->status);
            $item->movimentacao->status == 1 ? $item->movimentacao->motivo_inatividade = NULL : '';
            $this->db->set('motivo_inatividade', $item->movimentacao->motivo_inatividade);
            $result = $this->db->insert('item_movimentacao');
            
            $this->db->trans_complete();
            
            if (!$result) {
                throw new Exception("Ocorreu um erro de banco de dados ao tentar inserir movimentação do item.");
            }
        } catch (Exception $e) {
            throw new ExceptionDAO($e->getMessage());
        }
    }
    
    /**
     * Atualiza dados da movimentacao do item
     * 
     * @param  TOItem $item
     * @throws ExceptionDAO
     * @throws Exception
     */
    public function update_movimentacao(TOItem $item) {
        try {
            $this->db->set('total_estoque', $item->movimentacao->total_estoque);
            $this->db->set('total_manipulacao', $item->movimentacao->total_manipulacao);
            $this->db->set('total_disponivel', $item->movimentacao->total_disponivel);
            $this->db->set('status', $item->movimentacao->status);
            $this->db->set('motivo_inatividade', $item->movimentacao->motivo_inatividade);
            $this->db->where('codigo', $item->codigo);
            $result = $this->db->update('item_movimentacao');
            
            $this->db->trans_complete();

            if (!$result) {
                throw new Exception("Ocorreu um erro de banco de dados ao tentar atualizar movimentação do item.");
            }
        } catch (Exception $e) {
            throw new ExceptionDAO($e->getMessage());
        }
    }
    
    
    /**
     * Atualiza a movimentação do item de acordo com a ação do empréstimo
     * 
     * @param  TOItem $item
     * @throws ExceptionDAO
     * @throws Exception
     */
    public function mark_movimentacao_loan(TOItem $item) {
        try {
            $this->db->set('total_disponivel', $item->movimentacao->total_disponivel);
            $this->db->where('codigo', $item->codigo);
            $result = $this->db->update('item_movimentacao');
            
            if (!$result) {
                throw new Exception('Ocorreu um erro de banco de dados ao tentar atualizar movimentação do item.');
            }
            
            $this->db->trans_complete();
              
        } catch (Exception $e) {
            throw new ExceptionDAO($e->getMessage());
        }
    }
    
}